package com.demarc.pesquisas.web.jsf;

import com.demarc.pesquisas.infraestrutura.persistencia.Filtro;
import com.demarc.pesquisas.infraestrutura.persistencia.ObjetoPersistenteVersionado;
import com.demarc.pesquisas.infraestrutura.persistencia.ResultadoPaginado;
import com.demarc.pesquisas.negocio.service.IService;

@SuppressWarnings("serial")
public class ListaObjetoPersistenteDataModel<T extends ObjetoPersistenteVersionado<?>>
		extends ListaDataModel<T> {

	private IService<T, ?> service;

	/**
	 * Constrói um objeto do tipo ListaObjetoPersistenteDataModel
	 * 
	 * @param filtro
	 *            Objeto Filtro que será utilizado nas consultas
	 * @param manager
	 *            Objeto manager que ira executar a lógica das consultas
	 */
	public ListaObjetoPersistenteDataModel(Filtro filtro, IService<T, ?> manager) {
		super(filtro);
		this.service = manager;
	}

	/**
	 * Constrói um objeto do tipo ListaObjetoPersistenteDataModel
	 * 
	 * @param filtro
	 *            Objeto Filtro que será utilizado nas consultas
	 * @param service
	 *            Objeto manager que ira executar a lógica das consultas
	 * @param jaConsultado
	 *            Objeto que define se a pesquisa deve ser executada assim que
	 *            esta classe for instanciada.
	 */
	public ListaObjetoPersistenteDataModel(Filtro filtro,
			IService<T, ?> service, boolean jaConsultado) {
		super(filtro, jaConsultado);
		this.service = service;
	}

	/**
	 * Realiza uma consulta utilizando os parâmetros de busca do último Filtro
	 * da classe pai
	 */
	@Override
	protected ResultadoPaginado<T> consultarPorUltimoFiltro(Filtro ultimoFiltro) {
		return getService().consultarPaginandoPorFiltro(ultimoFiltro);
	}

	/**
	 * Realiza uma consulta utilizando o Filtro da classe pai
	 */
	@Override
	protected ResultadoPaginado<T> consultarPorFiltro() {
		return getService().consultarPaginandoPorFiltro(filtro);
	}

	public IService<T, ?> getService() {
		return service;
	}

	public void setService(IService<T, ?> service) {
		this.service = service;
	}
}